package com.hippo.core.util;

import cn.binarywang.tools.generator.ChineseAddressGenerator;
import cn.binarywang.tools.generator.ChineseIDCardNumberGenerator;
import cn.binarywang.tools.generator.ChineseMobileNumberGenerator;
import cn.binarywang.tools.generator.EmailAddressGenerator;
import cn.binarywang.tools.generator.bank.BankCardNumberGenerator;
import cn.binarywang.tools.generator.bank.BankCardTypeEnum;
import cn.binarywang.tools.generator.bank.BankNameEnum;
import com.hippo.core.util.custom.HKIDCardNumberGenerator;
import com.hippo.core.util.custom.PassportGenerator;


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * 数据生成自定义类
 * @author hippo
 */
public class CustomizeGenerator {

    /**
     * Instantiates a new Customize generator.
     */
    public CustomizeGenerator() {
    }

    /**
     * Random date.
     *
     * @param beginDate the start date
     * @param endDate   the end date
     * @return the date
     */
    public Date randomDate(String type, String beginDate, String endDate) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            if (type.equals("1")) {
                format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            }
            Date start = format.parse(beginDate);
            Date end = format.parse(endDate);

            if (start.getTime() >= end.getTime()) {
                return format.parse(endDate);
            }
            long date = random(start.getTime(), end.getTime());
            return new Date(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Random long.
     *
     * @param begin the start
     * @param end   the end
     * @return the long
     */
    public long random(long begin, long end) {
        long rtn = begin + (long) (Math.random() * (end - begin));
        if (rtn == begin || rtn == end) {
            return random(begin, end);
        }
        return rtn;
    }


    /**
     * Main object.
     *
     * @param packageName the package name
     * @param methodName  the method name
     * @return the object
     */
    public Object main(String packageName, String methodName, String params, String value) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String startTime = "2021-01-01";
        String endTime = format.format(new Date());
        if (params != null & value != null) {
            if (params.split(",").length == value.split(",").length) {
                if (packageName.equals("customize.Date")) {
                    assert value.split(",").length == 2;
                    startTime = value.split(",")[0];
                    endTime = value.split(",")[1];
                }
            }
        }
        //自定义类实现匹配
        switch (packageName) {
            case "customize.Date":
                Date date = randomDate("", startTime, endTime);
                switch (methodName) {
                    case "datetime":
                        date = randomDate("1", startTime, endTime);
                        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
                    case "timestamp":
                        return date.getTime();
                    default:
                        return new SimpleDateFormat("yyyy-MM-dd").format(date);
                }
            case "customize.Bank":
                return BankCardNumberGenerator.generate(BankNameEnum.ICBC, BankCardTypeEnum.DEBIT);
            case "customize.Address":
                return ChineseAddressGenerator.getInstance().generate();
            case "customize.IDCardNumber":
                return ChineseIDCardNumberGenerator.getInstance().generate();
            case "customize.MobileNum":
                return ChineseMobileNumberGenerator.getInstance().generate();
            case "customize.Email":
                return EmailAddressGenerator.getInstance().generate();
            case "customize.Passport":
                return PassportGenerator.getInstance().generate();
            case "customize.HKIDCardNumber":
                return HKIDCardNumberGenerator.getInstance().generate();
            case "customize.sex":
                String[] sex = {"男", "女"};
                int num = new Random().nextInt(2);
                return sex[num];
            case "customize.MaritalStatus":
                String[] marital = {"未婚", "已婚", "离婚", "丧偶"};
                return marital[new Random().nextInt(4)];
            case "customize.position":
                String[] position = {"行政主管", "企业主管", "经理人", "天文学家", "电脑程式设计人员", "系统分析师", "道景师", "建筑师", "交通规划师", "化学工程技术师", "土木工程师", "造景师", "测量员", "销售工程师", "工业工程师", "品质管制工程师", "陶瓷技师", "药师", "兽医师", "公共卫生医师", "中医师", "护理佐理员", "电视节目主持人", "品质管制助理员"};
                return position[new Random().nextInt(24)];
            case "customize.dept":
                String[] dept = {"党群部", "销售部", "追求部", "营业部", "共好部", "总宣部", "出口部", "采购部", "商务发展部", "研发部", "品管部"};
                return dept[new Random().nextInt(11)];
            case "customize.city":
                String[] city = {"杭州", "宁波", "温州", "嘉兴", "湖州", "绍兴", "金华", "衢州", "舟山", "台州", "丽水", "南京", "无锡", "徐州", "常州", "苏州", "南通", "连云港", "淮安", "盐城", "扬州", "镇江", "泰州", "宿迁", "合肥", "芜湖", "蚌埠", "淮南", "马鞍山", "淮北", "铜陵", "安庆", "黄山", "滁州", "阜阳", "宿州", "巢湖", "六安", "亳州", "池州", "宣城", "合肥", "芜湖", "蚌埠", "淮南", "马鞍山", "淮北", "铜陵", "安庆", "黄山", "滁州", "阜阳", "宿州", "巢湖", "六安", "亳州", "池州", "宣城", "江西：南昌", "景德镇", "萍乡", "九江", "新余", "鹰潭", "赣州", "吉安", "宜春", "抚州", "上饶", "济南", "青岛", "淄博", "枣庄", "东营", "烟台", "潍坊", "威海", "济宁", "泰安", "日照", "莱芜", "临沂", "德州", "聊城", "滨州", "菏泽", "北京", "上海", "天津", "重庆"};
                return city[new Random().nextInt(91)];
            case "customize.industry":
                String[] industry = {"保险业", "采矿", "能源", "餐饮", "宾馆", "电讯业", "房地产", "服务", "服装业", "公益组织", "广告业", "航空航天", "化学", "健康", "保健", "建筑业", "教育", "培训", "计算机", "金属冶炼", "警察", "消防", "会计", "美容", "媒体", "出版", "木材", "造纸", "零售", "批发", "农业", "旅游业", "司法", "律师", "司机", "体育运动", "学术研究", "演艺", "医疗服务", "艺术", "设计", "银行", "金融", "因特网", "音乐舞蹈", "邮政快递", "运输业", "政府机关", "机械制造"};
                return industry[new Random().nextInt(49)];
            case "customize.businessScope":
                String[] businessScope = {"电脑图文设计制作", "企业形象策划", "展览展示服务", "市场调研", "摄影服务", "资料翻译服务", "礼仪服务", "赛事活动策划", "公关活动策划", "快递服务", "室内保洁服务", "婚庆礼仪服务", "餐饮管理", "其他居民服务", "市政工程配套服务", "房产咨询", "商务咨询", "商务信息咨询", "旅游咨询", "旅游信息咨询", "财务咨询", "财务信息咨询", "理财咨询", "劳务咨询", "劳务信息咨询", "企业投资咨询", "投资管理咨询", "投资管理", "企业管理咨询", "企业营销咨询", "人力资源咨询", "人才信息咨询服务", "职业发展咨询", "市场调查及咨询服务", "文化教育信息咨询", "文化艺术交流策划咨询", "医疗健康保健咨询", "家政服务", "包装服务", "投资与资产管理", "社会经济咨询", "办公服务", "企业营销策划及管理咨询", "商务信息咨询", "会务代理", "会展咨询", "展览展示代理", "室内装潢设计咨询", "房地产信息咨询", "房屋经纪", "房地产营销策划", "物业管理咨询", "度假信息咨询", "法律信息咨询", "医药信息咨询", "医疗器械信息咨询", "电器安装", "制冷设备安装", "水电安装", "机电设备安装", "网络布线", "电脑安装维修", "屋顶防水", "建筑装潢", "混凝土切割", "水电安装", "管道维修", "工程机械设备维修", "楼宇清洗", "外墙粉刷", "石林养护", "地毯清洗", "中央空调清洗", "工业管道清洗", "建筑工程", "市政工程", "绿化工程", "园林工程", "室内装潢", "建筑设计", "景观设计", "室内设计", "园林绿化设计", "建筑装修装饰设计", "房屋建筑工程", "土石方工程", "地基与基础工程", "建筑装修装饰工程", "机电设备安装工程", "建筑幕墙工程", "预拌商品混凝土", "混凝土预制构件", "园林古建筑工程", "钢结构工程", "电梯安装工程", "消防设施工程", "建筑防水工程", "防腐保温工程", "金属门窗工程", "爆破与拆除工程", "建筑智能化工程", "房地产开发", "技术开发", "技术转让", "技术咨询", "技术服务", "计算机领域", "计算机技术咨询服务", "计算机软硬件", "网络科技", "网络技术", "通讯工程", "网络工程", "电子计算机与电子技术信息", "汽车技术", "生物与医药", "生物工程及生物制品研制", "开发", "销售", "化工新材料", "光机电一体化", "航天海洋与现代运输装备", "能源与环保", "民用核能技术", "传统产业中的高科技运用", "印务科技"};
                return businessScope[new Random().nextInt(126)];
            case "customize.nationality":
                String[] nationality = {"汉族", "满族", "蒙古族", "回族", "藏族", "维吾尔族", "苗族", "彝族", "壮族", "布依族", "侗族", "瑶族", "白族", "土家族", "哈尼族", "哈萨克族", "傣族", "黎族", "傈僳族", "佤族", "畲族", "高山族", "拉祜族", "水族", "东乡族", "纳西族", "景颇族", "柯尔克孜族", "土族", "达斡尔族", "仫佬族", "羌族", "布朗族", "撒拉族", "毛南族", "仡佬族", "锡伯族", "阿昌族", "普米族", "朝鲜族", "塔吉克族", "怒族", "乌孜别克族", "俄罗斯族", "鄂温克族", "德昂族", "保安族", "裕固族", "京族", "塔塔尔族", "独龙族", "鄂伦春族", "赫哲族", "门巴族", "珞巴族", "基诺族"};
                return nationality[new Random().nextInt(56)];
            case "customize.enterprise":
                String[] enterprise1 = {"楠途", "鸣晏", "希渝", "泰盛", "辉桦", "帝豪", "金渝", "立晟", "纶贤", "瀚杰", "鑫业", "鼎财", "利隆", "广达", "昂航", "卓翰", "聪志", "智嘉", "畅腾", "亿熙", "旭江", "建博", "毅联", "西安", "弘秋", "金泰", "奇致", "博亚", "汇亚", "景京", "盛尚", "冠智", "立德", "嘉迅", "业泽", "安弘", "善隆", "言谦", "雄卓", "平琛", "昂信", "吉青", "优桦", "弘烽", "诚杭", "佳东", "明仲", "洋仁", "钧贤", "澄岩", "泰道", "仁华", "铭信", "隆启", "力业", "卓文", "蓝峰", "鸣东", "同振", "宇卫", "仁宁", "炫炫", "滨毅", "森元", "东田", "盈鑫", "吉岳", "青晟", "秋伊", "卓才", "衡智", "诺源", "峰华", "航纳", "辰柏", "皓森", "仟健", "亮元", "炫扬", "元勤", "智扬", "成良", "雷卓", "奕超", "熙虹", "楚岩", "霖言", "海意", "江鸣", "秋盛"};
                String[] enterprise2 = {"服装贸易", "服饰贸易", "针纺织品", "装饰品", "进出口贸易", "教育科技", "科技发展", "生物科技", "电子科技", "环保科技", "网络科技", "生化科技", "激光科技", "节能科技", "能源科技", "农业科技", "医药科技", "信息服务", "劳务服务", "会议服务", "家政服务", "商务服务", "婚庆服务", "广告传媒", "广告文化", "环境技术", "农业高新技术", "检测技术", "信息技术", "经济技术", "消防技术", "工程技术", "机电技术", "生物技术", "新能源技术", "文化发展", "文化传播", "文化传媒", "文化交流", "文化广告", "咨询", "信息咨询", "教育咨询", "投资咨询", "管理咨询", "建筑设计咨询", "文化信息咨询", "技术培训", "企业管理培训", "计算机技术培训", "建筑设计", "家居装饰设计", "旅游规划设计", "建筑机械设备租赁", "汽车租赁", "建筑工程", "装饰工程", "园林绿化工程", "照明工程", "通讯工程", "物流运输", "投资管理", "企业管理", "餐饮管理", "管理顾问", "金融管理", "电器维修", "机械维修", "机减设备", "办公设备", "消防设备", "自控设备", "机电设备", "冷暖设备", "环保设备", "测试设备", "电力设备", "实验室设备", "印刷设计", "印刷技术", "印刷器材"};
                String[] enterprise3 = {"有限公司", "股份有限公司", "集团有限公司"};
                return enterprise1[new Random().nextInt(90)] + enterprise2[new Random().nextInt(81)] + enterprise3[new Random().nextInt(3)];
            case "customize.irregularity":
                return value;
            default:
                throw new Exception("自定义" + packageName + "类不存在");
        }
    }
}
